<?php


/*
echo base64_encode(chr(1).$nlSafe->jiami1("woaini"))."<br/>";
echo base64_encode(chr(2).$nlSafe->jiami2("woaini","666"))."<br/>";
echo base64_encode(chr(3).$nlSafe->jiami3("woaini"))."<br/>";
*/


//加密1，2用了时间，加密3没使用时间，适合易语言程序内的永久加密
class safe{
	function byteToHex($sdata)
	{
		$data = "";
		for($i=0;$i<strlen($sdata);$i++)
		{
			$int = ord(substr($sdata,$i,1));
			if($int>=16)
			{
				$data.= dechex($int);
			}else{
				$data.= "0".dechex($int);
			}
		}
		return $data;
	}
	function hexToByte($sdata)
	{
		$data = "";
		for($i=0;$i<strlen($sdata)/2;$i++)
		{
			$data .= chr(hexdec(substr($sdata,$i*2,2)));
		}
		return $data;

	}
	function jiami1($sdata)
	{
		$sdata = $this->byteAdd_de($sdata);
		$sdata = $this->byteMov_de($sdata);
		$sdata = $this->byteTime_de($sdata);
		$sdata = $this->grData_de($sdata);
		$sdata = $this->dataof($sdata);
		return $sdata;
	}
	function jiemi1($sdata)
	{
		$sdata = $this->dataof($sdata);
		$sdata = $this->grData_en($sdata);
		$sdata = $this->byteTime_en($sdata);
		$sdata = $this->byteMov_en($sdata);
		$sdata = $this->byteAdd_en($sdata);
		return $sdata;
	}

	function jiami2($sdata,$publicKey)
	{
		$sdata = $this->grData_de($sdata);
		$sdata = $this->byteMov_de($sdata);
		$sdata = $this->byteTime_de($sdata);
		$sdata = $this->byteAdd_de($sdata);
		$sdata = $this->dataof($sdata);
		$sdata = $this->key_de($sdata,$publicKey);
		return $sdata;
	}

	function jiemi2($sdata,$publicKey)
	{
		$sdata = $this->key_en($sdata,$publicKey);
		$sdata = $this->dataof($sdata);
		$sdata = $this->byteAdd_en($sdata);
		$sdata = $this->byteTime_en($sdata);
		$sdata = $this->byteMov_en($sdata);
		$sdata = $this->grData_en($sdata);
		return $sdata;
	}

	function jiami3($sdata){
		$sdata = $this->grData_de($sdata);
		$sdata = $this->dataof($sdata);
		$sdata = $this->grData_de($sdata);
		$sdata = $this->dataof($sdata);
		$sdata = $this->byteMov_de($sdata);
		$sdata = $this->byteAdd_de($sdata);
		$sdata = $this->dataof($sdata);
		return $sdata;
	}

	function jiemi3($sdata){
		$sdata = $this->dataof($sdata);
		$sdata = $this->byteAdd_en($sdata);
		$sdata = $this->byteMov_en($sdata);
		$sdata = $this->dataof($sdata);
		$sdata = $this->grData_en($sdata);
		$sdata = $this->dataof($sdata);
		$sdata = $this->grData_en($sdata);
		return $sdata;
	}


	//nl_位置颠倒_加解密
	function dataof($sdata)
	{
		$data = "";
		$number = strlen($sdata);
		for($i=$number-1;$i>=0;$i--)
		{
			$data .= substr($sdata,$i,1);
		}
		return $data;
	}

	//nl_字节相加_加密
	function byteAdd_de($sdata)
	{
		$number = strlen($sdata);
		$data = "";
		$rand1 = rand(1,25);
		$rand2 = rand(1,25);
		$data = chr($rand1).chr($rand2);
		for($i=0;$i<$number;$i++)
		{
			$int = ord(substr($sdata,$i,1));
			if(($i+1) % 2 == 0)
			{
				$int = $int + $rand2;
			}
			else{
				$int = $int + $rand1;
			}
			$data .= chr($int);
		}
		return $data;
	}

	//nl_字节相加_解密
	function byteAdd_en($sdata)
	{
		$data = "";
		$rand1 = ord(substr($sdata,0,1));
		$rand2 = ord(substr($sdata,1,1));
		for($i=2;$i<strlen($sdata);$i++)
		{
			$int = ord(substr($sdata,$i,1));
			if(($i+1) % 2 == 0)
			{
				$int = $int - $rand2;
			}
			else{
				$int = $int - $rand1;
			}
			$data .= chr($int);
		}
		return $data;
	}

	//nl_干扰数据_加密
	function grData_de($sdata)
	{
		$data = "";
		for($i=0;$i<strlen($sdata);$i++)
		{
			$int = ord(substr($sdata,$i,1));
			$data .= chr($int);
			$data .= chr(rand(1,100));
		}

		return $data;
	}

	//nl_干扰数据_解密
	function grData_en($sdata)
	{
		$data = "";
		for($i=0;$i<strlen($sdata);$i++)
		{
			if(($i+1) % 2 != 0)
			{
				$data.= substr($sdata,$i,1);
			}
		}
		return $data;
	}

	//nl_字节位移_加密
	function byteMov_de($sdata)
	{
		$data = "";
		$rand1 = rand(1,10);
		$rand2 = rand(1,10);
		$data = chr($rand1).chr($rand2);
		for($i=0;$i<strlen($sdata);$i++)
		{
			$int = ord(substr($sdata,$i,1));
			if(($i+1) % 2 == 0)
			{
				$int = $int -1 + $rand2;
			}
			else{
				$int = $int +1 + $rand1;
			}
			$data.=chr($int);
		}
		return $data;
	}

	//nl_字节位移_解密
	function byteMov_en($sdata)
	{
		$data = "";
		$rand1 = ord(substr($sdata,0,1));
		$rand2 = ord(substr($sdata,1,1));
		for($i=2;$i<strlen($sdata);$i++)
		{
			$int = ord(substr($sdata,$i,1));
			if(($i+1) % 2 == 0)
			{
				$int = $int +1 - $rand2;
			}
			else{
				$int = $int -1 - $rand1;
			}
			$data.=chr($int);
		}
		return $data;
	}

	//nl_时间位移_加密
	function byteTime_de($sdata)
	{
		$sdata = $sdata . chr(10) . chr(10) . chr(20) . chr(10) . chr(20);
		$rand1 = intval(date("H"));
		$rand2 = intval(date("i"));

		$tmp = rand(1,10);
		$data = chr($tmp);

		if($rand2>30){$rand2 = intval($rand2 / 2);}

		for($i=0;$i<strlen($sdata);$i++)
		{
			$int = ord(substr($sdata,$i,1));
			if(($i+1) % 3 == 0)
			{
				$int = $int + $rand2 + $tmp;
			}
			else{
				$int = $int + $rand1 + $tmp;
			}
			$data.=chr($int);
		}
		return $data;
	}



	//nl_时间位移_解密
	function byteTime_en($sdata)
	{
		$rand1 = intval(date("H"));
		$rand2 = intval(date("i"));
		$tmp = ord(substr($sdata,0,1));
		for($i=0;$i<10;$i++)
		{
	
			$data = "";
			if($rand2 > 30){
				$rand2_ = intval($rand2 / 2);
			}
			else{
				$rand2_ = $rand2;
			}
			for($n=0;$n<strlen($sdata)-1;$n++)
			{
				$int = ord(substr($sdata,$n+1,1));
				if(($n+1) % 3 == 0)
				{
					$int = $int - $rand2_ - $tmp;
				}else{
					$int = $int - $rand1 - $tmp;
				}
				$data.= chr($int);
			}
	
			if(substr($data,strlen($data)-5,5) == chr(10) . chr(10) . chr(20) . chr(10) . chr(20))
			{
				return substr($data,0,strlen($data)-5);
			}
			$rand2 = $rand2 - 1;
		
		}

		$rand1 = intval(date("H"));
		$rand2 = intval(date("i"));
		$tmp = ord(substr($sdata,0,1));
		for($i=0;$i<10;$i++)
		{
			$data = "";
			if($rand2 > 30){
				$rand2_ = intval($rand2 / 2);
			}
			else{
				$rand2_ = $rand2;
			}
			for($n=0;$n<strlen($sdata)-1;$n++)
			{
				$int = ord(substr($sdata,$n+1,1));
				if(($n+1) % 3 == 0)
				{
					$int = $int - $rand2_ - $tmp;
				}else{
					$int = $int - $rand1 - $tmp;
				}
				$data.= chr($int);
			}
	
			if(substr($data,strlen($data)-5,5) == chr(10) . chr(10) . chr(20) . chr(10) . chr(20))
			{
				return substr($data,0,strlen($data)-5);
			}
			$rand2 = $rand2 + 1;
		
		}
		return "";

	}

	//nl_密钥算法_加密
	function key_de($sdata,$publicKey){
		$key2 = "zhendesiquanjia";
		$key = md5($publicKey."pjsiquanjia".$key2);
		$tmp = rand(1,8);
		$data = chr($tmp);
		$keyIndex = 0;
		for($i=0;$i<strlen($sdata);$i++)
		{
			$int = ord(substr($sdata,$i,1));
			if($keyIndex>31){$keyIndex = 0;}
			$keyInt = ord(substr($key,$keyIndex,1)) - 47;
			if($keyInt>20){
				$int = $int + intval($keyInt / 2) + $tmp;
			}
			else{
				$int = $int + $keyInt + $tmp;
			}
			$data.=chr($int);
			$keyIndex++;
		}
		return $data;
	}

	//nl_密钥算法_解密
	function key_en($sdata,$publicKey){
		$key2 = "zhendesiquanjia";
		$key = md5($publicKey."pjsiquanjia".$key2);
		$tmp = ord(substr($sdata,0,1));
		$data = "";
		$keyIndex = 0;
		for($i=0;$i<strlen($sdata)-1;$i++)
		{
			$int = ord(substr($sdata,$i+1,1));
			if($keyIndex>31){$keyIndex = 0;}
			$keyInt = ord(substr($key,$keyIndex,1)) - 47;
			if($keyInt>20){
				$int = $int - intval($keyInt / 2) - $tmp;
			}
			else{
				$int = $int - $keyInt - $tmp;
			}
			$data.=chr($int);
			$keyIndex++;
		}
		return $data;
	}

	function outByte($data)
	{
		$str = "{";

		for($i=0;$i<strlen($data);$i++)
		{
			$byte = ord(substr($data,$i,1));
			$str = $str.strval($byte).",";
		}
		$str = substr($str,0,strlen($str)-1)."}";
		echo $str;
	}


}



?>
